package com.example.springbootzklock.lock;


/**
 * @Description: 模版方法 骨架
 * @Author: mingtian
 * @CreateDate: 2019/9/24 21:06
 * @Version: 1.0
 */
public abstract class AbstractTemplateLock implements Lock {


    /**
     * 获取锁
     * 模版方法 定义共同抽象方法
     */
    @Override
    public void getLock() {
        if (tryLock()) {
            System.out.println(Thread.currentThread().getName() + ",获取锁成功!");
        } else {
            //获取锁失败 则进行等待  有事件监听逻辑
            waitLock();
            //重新获取锁
            getLock();
        }
    }

    /**
     * 获取锁
     *
     * @return
     */
    protected abstract boolean tryLock();

    /**
     * 等待锁
     */
    protected abstract void waitLock();

    /**
     * 释放锁实现类
     */
    protected abstract void unLockImpl();

    /**
     * 释放锁
     */
    @Override
    public void unLock() {
        unLockImpl();
    }

}